home *** CD-ROM | disk | FTP | other *** search
- /*
- IC Link In Subs.c
-
- C code for more link in stuff.
-
- */
-
- #include <Processes.h>
- #include <AppleEvents.h>
- #include <Aliases.h>
-
- #include "IC Types.h"
- #include "IC Keys.h"
-
- #include "IC Link In Subs.h"
-
- #ifdef __cplusplus
- extern "C" {
- #endif
-
- // Local Prototypes
- Boolean HaveAliasManager(void);
- Boolean FindProcess(OSType creator,OSType typ,ProcessSerialNumber* process,FSSpecPtr fs);
- OSErr GetVolInfo(StringPtr name,short* vrn,short index);
- OSErr ConfirmAppl(OSType creator,FSSpecPtr fss);
- OSErr ScanVolume(OSType creator,short vref,FSSpecPtr fs);
- OSErr FindApplication(OSType creator,FSSpecPtr fs);
- ICError PrepareToLaunch(AppleEvent* theEvent,Boolean tofront,LaunchParamBlockRec* launchThis);
- ICError CreateGURLEvent(OSType creator,Handle urlh,AppleEvent* theEvent);
- ICError CreateEditPrefEvent(OSType creator,StringPtr key,FSSpecPtr prefsfile,AppleEvent* theEvent);
- ICError LaunchFSSpec(FSSpecPtr fs,AppleEvent* theEvent);
- ICError SendEvent(AppleEvent* theEvent,OSType creator);
- OSErr FSpGetCatInfo(FSSpecPtr fs,short index,CInfoPBRec* pb);
- OSErr FSSpecToFullPath(FSSpecPtr fs,StringPtr path);
- OSErr GetVolumeStuff(StringPtr name,long date,short* vrn);
-
- #ifdef __cplusplus
- }
- #endif
-
- void PasStrCopy(StringPtr from,StringPtr to){
- register unsigned char ch,*f,*t;
-
- ch=from[0];
-
- f=from;
- t=to;
-
- *f=*t;
- f++;
- t++;
-
- while (ch){
- *f=*t;
- f++;
- t++;
- ch--;
- }
-
- }
-
- ICError HaveProcessManager(void){
- long gv;
-
- if ((Gestalt(gestaltOSAttr,&gv)==noErr)&&(gv&gestaltLaunchControl))
- return (ICError)noErr;
-
- return (ICError)unimpErr;
- }
-
- ICError CanInteract(void){
- ICError err=noErr;
- ProcessInfoRec info;
- ProcessSerialNumber process_us,process_foreground;
- Boolean result;
-
- if (HaveProcessManager()==noErr){
- process_us.highLongOfPSN=0;
- process_us.lowLongOfPSN=kCurrentProcess;
-
- err=GetFrontProcess(&process_foreground);
-
- if (err==noErr)
- err=SameProcess(&process_us,&process_foreground,&result);
-
- if ((err==noErr)&&(!result))
- err=errAENoUserInteraction;
- }
-
- return noErr;
- // should this be
- // return err;
- }
-
- Boolean HaveNewStandardFile(void){
- long gv;
-
- return ((Gestalt(gestaltStandardFileAttr,&gv)==noErr)&&(gv&gestaltStandardFile58));
- }
-
- Boolean HaveAliasManager(void){
- long gv;
-
- return ((Gestalt(gestaltAliasMgrAttr,&gv)==noErr)&&(gv&gestaltAliasMgrPresent));
- }
-
- Boolean FindProcess(OSType creator,OSType typ,ProcessSerialNumber* process,FSSpecPtr fs){
- ProcessInfoRec info;
- OSErr oe;
- long gv;
-
- if (HaveProcessManager()==noErr){
- process->highLongOfPSN=0;
- process->lowLongOfPSN=kNoProcess;
- info.processInfoLength=sizeof(ProcessInfoRec);
- info.processName=(StringPtr)0;
- info.processAppSpec=fs;
-
- while (GetNextProcess(process)==noErr){
- if ((GetProcessInformation(process,&info)==noErr)&&(info.processType==typ)&&(info.processSignature==creator))
- return true;
- }
- }
-
- return false;
- }
-
- OSErr GetVolInfo(StringPtr name,short* vrn,short index){
- VolumeParam pb;
- OSErr oe;
-
- if ((name[0]!=0)&&(name[name[0]]!=':')){
- name[name[0]+1]=':';
- name[0]++;
- }
-
- pb.ioNamePtr=name;
- pb.ioVRefNum=*vrn;
- pb.ioVolIndex=index;
- oe=PBGetVInfo((ParmBlkPtr)&pb,false);
- if (oe==noErr)
- *vrn=pb.ioVRefNum;
-
- return oe;
- }
-
- OSErr ConfirmAppl(OSType creator,FSSpecPtr fss){
- OSErr err;
- FInfo info;
-
- err=HGetFInfo(fss->vRefNum,fss->parID,fss->name,&info);
-
- if (err==noErr){
- if ((info.fdType!='APPL')||(info.fdCreator!=creator))
- return afpItemNotFound;
- }
-
- return err;
- }
-
- OSErr ScanVolume(OSType creator,short vref,FSSpecPtr fs){
- OSErr err;
- short file_index=1;
- DTPBRec pbdt;
- Boolean found=false;
-
- fs->name[0]=0;
- pbdt.ioNamePtr=fs->name;
- pbdt.ioVRefNum=vref;
-
- err=PBDTGetPath(&pbdt);
- if (err==noErr){
- do {
- pbdt.ioIndex=file_index;
- pbdt.ioFileCreator=creator;
-
- err=PBDTGetAPPLSync(&pbdt);
-
- if (err==noErr){
- fs->vRefNum=vref;
- fs->parID=pbdt.ioAPPLParID;
- found=ConfirmAppl(creator,fs)==noErr;
- }
- file_index++;
- } while ((!found)&&(err==noErr));
- }
-
- return err;
- }
-
- OSErr FindApplication(OSType creator,FSSpecPtr fs){
- OSErr err;
- short vol_index=1;
- short vref;
- Boolean found=false;
-
- do {
- vref=0;
- err=GetVolInfo(fs->name,&vref,vol_index);
-
- if (err==noErr){
- err=ScanVolume(creator,vref,fs);
-
- if (err==noErr)
- found=true;
- else
- err=noErr;
- }
-
- vol_index++;
-
- } while ((!found)&&(err==noErr));
-
- if (!found){
- err=afpItemNotFound;
- fs->vRefNum=0;
- fs->parID=2;
- fs->name[0]=0;
- }
-
- return err;
- }
-
- ICError PrepareToLaunch(AppleEvent* theEvent,Boolean tofront,LaunchParamBlockRec* launchThis){
- AEDesc launchDesc;
- OSErr err;
-
- err=AECoerceDesc(theEvent,typeAppParameters,&launchDesc);
-
- HLock((Handle)theEvent->dataHandle);
-
- launchThis->launchAppParameters=(AppParametersPtr)*(theEvent->dataHandle);
- launchThis->launchBlockID=extendedBlock;
- launchThis->launchEPBLength=extendedBlockLen;
- launchThis->launchFileFlags=0;
- launchThis->launchControlFlags=launchContinue | launchNoFileFlags;
- if (!tofront)
- launchThis->launchControlFlags |= launchDontSwitch;
-
- return err;
- }
-
- ICError CreateGURLEvent(OSType creator,Handle urlh,AppleEvent* theEvent){
- AEDesc targetAddress;
- ICError err,err2;
- SignedByte s;
-
- err=AECreateDesc(typeApplSignature,&creator,sizeof(OSType),&targetAddress);
- err2=AECreateAppleEvent('GURL','GURL',&targetAddress,kAutoGenerateReturnID,kAnyTransactionID,theEvent);
-
- if (err==noErr)
- err=err2;
-
- s=HGetState(urlh);
- HLock(urlh);
-
- err2=AEPutKeyPtr(theEvent,keyDirectObject,typeChar,*urlh,GetHandleSize(urlh));
- HSetState(urlh,s);
-
- if (err==noErr)
- err=err2;
-
- if (err!=noErr){
- AEDisposeDesc(theEvent);
- theEvent=(AppleEvent*)0;
- }
-
- AEDisposeDesc(&targetAddress);
-
- return err;
- }
-
- ICError CreateEditPrefEvent(OSType creator,StringPtr key,FSSpecPtr prefsfile,AppleEvent* theEvent){
- AEDesc targetAddress;
- ICError err,err2;
-
- err=AECreateDesc(typeApplSignature,&creator,sizeof(OSType),&targetAddress);
- err2=AECreateAppleEvent('ICAp','ICAp',&targetAddress,kAutoGenerateReturnID,kAnyTransactionID,theEvent);
- if (err==noErr)
- err=err2;
-
- err2=AEPutKeyPtr(theEvent,'----','TEXT',&(key[1]),key[0]);
- if (err==noErr)
- err=err2;
-
- err2=AEPutKeyPtr(theEvent,'dest','fss ',prefsfile,sizeof(FSSpec));
- if (err==noErr)
- err=err2;
-
- if (err!=noErr){
- AEDisposeDesc(theEvent);
- theEvent=(AppleEvent*)0;
- }
-
- AEDisposeDesc(&targetAddress);
-
- return err;
- }
-
- ICError LaunchFSSpec(FSSpecPtr fs,AppleEvent* theEvent){
- LaunchParamBlockRec launchThis;
- AEDesc launchDesc;
- ICError err;
-
- launchThis.launchAppSpec=fs;
- err=PrepareToLaunch(theEvent,true,&launchThis);
- if (err==noErr)
- err=LaunchApplication(&launchThis);
- if (err==memFullErr){
- launchThis.launchControlFlags |= launchUseMinimum;
- err=LaunchApplication(&launchThis);
- }
-
- return err;
- }
-
- ICError SendEvent(AppleEvent* theEvent,OSType creator){
- ICError err;
- ProcessSerialNumber psn;
- FSSpec app_fs;
- AppleEvent reply;
-
- if (FindProcess(creator,'APPL',&psn,&app_fs)){
- SetFrontProcess(&psn);
- err=AESend(theEvent,&reply,kAENoReply,kAEHighPriority,kNoTimeOut,(AEIdleUPP)0,(AEFilterUPP)0);
- } else {
- err=FindApplication(creator,&app_fs);
- if (err==noErr)
- err=LaunchFSSpec(&app_fs,theEvent);
- }
-
- return err;
- }
-
- ICError EditPreferences(StringPtr key,FSSpecPtr prefsfile){
- ICError err;
- AppleEvent theEvent;
-
- err=HaveProcessManager();
- if (err==noErr){
- err=CreateEditPrefEvent(kICCreator,key,prefsfile,&theEvent);
- if (err==noErr)
- err=SendEvent(&theEvent,kICCreator);
-
- AEDisposeDesc(&theEvent);
- }
-
- return err;
- }
-
- ICError FindScheme(Handle urlh,StringPtr scheme){
- ICError err=noErr;
- char tmp=':';
-
- long ndx=Munger(urlh,0,&tmp,1,(Ptr)0,0);
-
- if ((ndx<0)||(ndx>255)){
- err=icNoURLErr;
- }
-
- if (err==noErr){
- scheme[0]=ndx;
- BlockMoveData(*urlh,&(scheme[1]),ndx);
- }
-
- return err;
- }
-
- ICError LaunchURL(OSType helper,Handle urlh){
- ICError err;
- AppleEvent theEvent;
-
- err=HaveProcessManager();
-
- if (err==noErr){
- err=CreateGURLEvent(helper,urlh,&theEvent);
- if (err==noErr)
- err=SendEvent(&theEvent,helper);
- AEDisposeDesc(&theEvent);
- }
-
- return err;
- }
-
- OSErr FSpGetCatInfo(FSSpecPtr fs,short index,CInfoPBRec* cpb){
- HFileInfo* pb=&(cpb->hFileInfo);
-
- pb->ioVRefNum=fs->vRefNum;
- pb->ioDirID=fs->parID;
- pb->ioNamePtr=fs->name;
- pb->ioFDirIndex=index;
-
- return PBGetCatInfoSync(cpb);
- }
-
- OSErr FSSpecToFullPath(FSSpecPtr fs,StringPtr path){
- OSErr err=noErr;
- CInfoPBRec pb;
- Str255 s;
-
- if (path==(StringPtr)0)
- return paramErr;
-
-
- if (fs->parID==1){
- BlockMoveData(fs->name,path,fs->name[0]+1);
- path[0]++;
- path[path[0]]=':';
- } else {
- BlockMoveData(fs->name,s,fs->name[0]+1);
-
- while ((err==noErr)&&(fs->parID!=1)){
- err=FSpGetCatInfo(fs,-1,&pb);
-
- BlockMoveData(fs->name,path,fs->name[0]+1);
- path[0]++;
- path[path[0]]=':';
- BlockMoveData(&(s[1]),&(path[path[0]+1]),s[0]);
- path[0]+=s[0];
-
- fs->parID=pb.hFileInfo.ioFlParID;
-
- BlockMoveData(path,s,path[0]+1);
- }
- }
-
- return err;
- }
-
- OSErr GetVolumeStuff(StringPtr name,long date,short* vrn){
- OSErr err;
- VolumeParam pb;
- Str255 s;
- register short i,pass;
-
- for (pass=1;pass<3;pass++){
- i=1;
- while (1){
- pb.ioVolIndex=i;
- i++;
- pb.ioNamePtr=s;
- s[0]=0;
-
- err=PBGetVInfoSync((ParamBlockRec*)&pb);
-
- if (err==noErr){
- break;
- }
-
- if (IUEqualString(name,s)==0){
- if ((pass==2)||(pb.ioVCrDate==date)){
- break;
- }
- }
- }
-
- if (err==noErr)
- break;
- }
-
- if (err==noErr)
- *vrn=pb.ioVRefNum;
-
- return err;
- }
-
- ICError ICFileSpecToFSSpec(ICFileSpecHandle filespec,Boolean can_interact,FSSpecPtr fs){
- ICError err=noErr;
- long loe;
- long attr;
- CInfoPBRec pb;
- AliasHandle alias;
- short aliasCount;
- Boolean needsUpdate;
- long rule_mask;
-
- if (GetHandleSize((Handle)filespec)<sizeof(ICFileSpec))
- return paramErr;
-
- if (((*filespec)->alias.aliasSize==0)||(!HaveAliasManager())){
- err=GetVolumeStuff((*filespec)->vol_name,(*filespec)->vol_creation_date,&fs->vRefNum);
-
- if (err==noErr){
- fs->parID=(*filespec)->fss.parID;
- BlockMoveData((*filespec)->fss.name,fs->name,(*filespec)->fss.name[0]+1);
- err=FSpGetCatInfo(fs,0,&pb);
- }
- } else {
- alias=(AliasHandle)filespec;
- err=HandToHand((Handle*)(&alias));
- if (err==noErr){
- loe=Munger((Handle)alias,0,(Ptr)0,sizeof(ICFileSpec)-sizeof(AliasRecord),&loe,0);
- aliasCount=0;
- rule_mask=kARMSearch | kARMMountVol;
- if ((!can_interact)||(CanInteract()!=noErr))
- rule_mask |= kARMNoUI;
- err=MatchAlias((FSSpecPtr)0,rule_mask,alias,&aliasCount,fs,&needsUpdate,(AliasFilterUPP)0,(Ptr)0);
- }
- DisposeHandle((Handle)alias);
- }
-
- return err;
- }
-
- OSErr FSSpecToICFileSpec(FSSpecPtr fs,ICFileSpecHandle filespec){
- AliasHandle alias;
- VolumeParam pb;
- OSErr err;
- Str63 vname;
- long loe;
-
- SetHandleSize((Handle)filespec,sizeof(ICFileSpec));
- err=MemError();
-
- if (err==noErr){
- pb.ioVRefNum=fs->vRefNum;
- pb.ioVolIndex=0;
- pb.ioNamePtr=vname;
- err=PBGetVInfoSync((ParamBlockRec*)&pb);
-
- if (err==noErr){
- (*filespec)->vol_creation_date=pb.ioVCrDate;
- BlockMoveData(vname,(*filespec)->vol_name,vname[0]+1);
- }
-
- BlockMoveData((Ptr)fs,(Ptr)&((*filespec)->fss),sizeof(FSSpec));
- (*filespec)->alias.userType=(OSType)0;
- (*filespec)->alias.aliasSize=0;
- }
-
- if ((err==noErr)&&(HaveAliasManager())){
- err=NewAlias((FSSpecPtr)0,fs,&alias);
-
- if (err==noErr){
- err=HandAndHand((Handle)alias,(Handle)filespec);
- if (err==noErr){
- loe=Munger((Handle)filespec,sizeof(ICFileSpec)-sizeof(AliasRecord),(Ptr)0,sizeof(AliasRecord),&loe,0);
- }
- DisposeHandle((Handle)alias);
- }
- err=noErr;
- }
-
- return err;
- }
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-